#include <iostream>
#include <typeinfo>

void Foo1(void)        { std::cout<<"void Foo1(void)\n"; }
void Foo2(int a)       { std::cout<<"void Foo2("<<a<<")\n"; }
void Foo3(int a,int b) { std::cout<<"void Foo3("<<a<<")("<<b<<")\n";}

float Foo4()                        { std::cout<<"float Foo4()\n"; return 0.0f; }
float Foo5(int a)                   { std::cout<<"float Foo5("<<a<<")\n"; return 0.0f; }
float Foo6(int a, const char* text) { std::cout<<"float Foo6("<<a<<")("<<text<<")\n"; return 0.0f; }

class Crolik
{
public:
    void Foo1(void)        { std::cout<<"void Crolik::Foo1(void)\n"; }
    void Foo2(const int a) { std::cout<<"void Crolik::Foo2("<<a<<")\n"; }
    void Foo3(int a,int b) { std::cout<<"void Crolik::Foo3("<<a<<")("<<b<<")\n";}
    float Foo4()                        { std::cout<<"float Crolik::Foo4()\n"; return 0.0f; }
    float Foo5(int a)                   { std::cout<<"float Crolik::Foo5("<<a<<")\n"; return 0.0f; }
    float Foo6(int a, const char* text) { std::cout<<"float Crolik::Foo6("<<a<<")("<<text<<")\n"; return 0.0f; }
};

#include "Execute.h"

int main()
{
    Commands::Dispatchable manager;

    manager.AddCommand( 0,  Commands::Executer(Foo1)              );
    manager.AddCommand( 0,  Commands::Executer(Foo2,10)           );
    manager.AddCommand( 0,  Commands::Executer(Foo3,10,20)        );
    manager.AddCommand( 0,  Commands::Executer(Foo4)              );
    manager.AddCommand( 0,  Commands::Executer(Foo5,10)           );
    manager.AddCommand( 0,  Commands::Executer(Foo6,10,"HELLO20") );

    Crolik crol;
    manager.AddCommand( 0,  Commands::Executer(&crol, &Crolik::Foo1 )               );
    manager.AddCommand( 0,  Commands::Executer(&crol, &Crolik::Foo2,10 )            );
    manager.AddCommand( 0,  Commands::Executer(&crol, &Crolik::Foo3,10, 20 )        );
    manager.AddCommand( 0,  Commands::Executer(&crol, &Crolik::Foo4)                );
    manager.AddCommand( 0,  Commands::Executer(&crol, &Crolik::Foo5,10)             );
    manager.AddCommand( 0,  Commands::Executer(&crol, &Crolik::Foo6,10, "HELLO20" ) );
    manager.Live(1);

    std::cout<< "//-----------------\n";

    manager.AddCommand( 0,  Commands::Execute(Foo1)              );
    manager.AddCommand( 0,  Commands::Execute(Foo2,10)           );
    manager.AddCommand( 0,  Commands::Execute(Foo3,10,20)        );
    manager.AddCommand( 0,  Commands::Execute(Foo4)              );
    manager.AddCommand( 0,  Commands::Execute(Foo5,10)           );
    manager.AddCommand( 0,  Commands::Execute(Foo6,10,"HELLO20") );
    manager.AddCommand( 0,  Commands::Execute(&crol, &Crolik::Foo1 )               );
    manager.AddCommand( 0,  Commands::Execute(&crol, &Crolik::Foo2,10 )            );
    manager.AddCommand( 0,  Commands::Execute(&crol, &Crolik::Foo3,10, 20 )        );
    manager.AddCommand( 0,  Commands::Execute(&crol, &Crolik::Foo4)                );
    manager.AddCommand( 0,  Commands::Execute(&crol, &Crolik::Foo5,10)             );
    manager.AddCommand( 0,  Commands::Execute(&crol, &Crolik::Foo6,10, "HELLO20" ) );
    manager.Live(1);

   return 0;
}




